package com.itsitio.dbloader.dao.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;

import com.itsitio.dbloader.dao.UsuarioDao;
import com.itsitio.dbloader.dao.base.SpringHibernateDao;
import com.itsitio.dbloader.modelo.usuario.Usuario;
import com.itsitio.dbloader.servicio.UsuarioSrv;

//@Repository("usuarioDao")
@Repository
public class UsuarioDaoImpl extends SpringHibernateDao<Usuario> implements
			UsuarioDao{
	
	@Autowired
	UsuarioSrv usuarioService;
	


	
	@Override
	public void eliminar(List<Usuario> objetos) throws DataAccessException {
		
		for (Usuario dato : objetos) {
			eliminar(dato);
		}
	}


	@Override
	public void eliminar(Usuario objeto) throws DataAccessException {
		super.eliminar(objeto);
	}


	@Autowired
	public UsuarioDaoImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
		// TODO Auto-generated constructor stub
	}
	
	
	@Override
	protected Class<Usuario> getObjetoManejado() {
			return Usuario.class;
	}
	
	@Override
	public List<Usuario> obtenerUsuariosActivos() {
		DetachedCriteria criteria = DetachedCriteria.forClass(Usuario.class);
		criteria.add(Restrictions.eq("activo", true));
		return getHibernateTemplate().findByCriteria(criteria);
	}

	@Override
	public Usuario obtenerPorUsername(String mail , boolean soloActivos) {
		Criteria criteria = getSession().createCriteria(Usuario.class);
		criteria.add(Restrictions.eq("mail", mail));
		if(soloActivos){
			criteria.add(Restrictions.eq("activo", true));
		}
		List<Usuario> result = criteria.list();
		if(result.isEmpty()){
			return null;
		}else{
			return (Usuario) result.get(0);	
		}
		
	}	
	
	@Override
	public List<Usuario> obtenerUsuariosInactivos(){
		DetachedCriteria criteria = DetachedCriteria.forClass(Usuario.class);
		criteria.add(Restrictions.eq("activo", false));
		return getHibernateTemplate().findByCriteria(criteria);
	}
	
	@Override
	public Usuario buscarPorEmail(String email)
	{
		Criteria criteria = getSession().createCriteria(Usuario.class);
		criteria.add(Restrictions.eq("mail", email));
		List<Usuario> result = criteria.list();
		if(result.isEmpty())
		{
			return null;
		}else
		{
			return result.get(0);	
		}
	}


	@Override
	public List<Usuario> obtenerUsuarios() {
		System.out.println("=========== UsuarioDaoImpl.obtenerUsuarios()");
		DetachedCriteria criteria = DetachedCriteria.forClass(Usuario.class);
		return getHibernateTemplate().findByCriteria(criteria);
	}


	@Override
	public List<Usuario> obtenerPersonal() {
		DetachedCriteria criteria = DetachedCriteria.forClass(Usuario.class);
		criteria.add(Restrictions.eq("esAdmin", false));
		criteria.add(Restrictions.eq("esLider", false));
		return getHibernateTemplate().findByCriteria(criteria);
	}


	@Override
	public List<Usuario> obtenerPorTexto(String texto, String filtro) {
		
		if(filtro.equals("mail")){
			DetachedCriteria criteria = DetachedCriteria.forClass(Usuario.class);
			criteria.add(Restrictions.like("mail", texto+"%"));
			criteria.add(Restrictions.eq("activo", true));
			return (List<Usuario>) getHibernateTemplate().findByCriteria(criteria);
		}else{
			StringBuilder sqlQuery = new StringBuilder("");
			String sql = 
				
				"SELECT dbo.Usuario.id FROM dbo.Usuario " + 
				"INNER JOIN dbo.DatosPersona " +
				"ON dbo.DatosPersona." + filtro + " LIKE '" + texto + "%' " +
				"WHERE dbo.Usuario.datosPersonales_id = dbo.DatosPersona.id";
			
			sqlQuery.append(sql);
			SQLQuery q = getSession().createSQLQuery(sqlQuery.toString());
			List<Object> result = q.list();
			if(result.isEmpty()){
				return null;
			}else{
				List<Usuario> usuarios = new ArrayList<Usuario>();
				for (int i = 0; i < result.size(); i++) {
					usuarios.add(usuarioService.obtenerPorId(Long.parseLong(result.get(i).toString())));
				}
				return usuarios;
			}
		}
			
	}


	@Override
	public Usuario obtenerPorIS(String is) {
		Criteria criteria = getSession().createCriteria(getObjetoManejado());
		criteria.add(Restrictions.eq("codigoIS", is));
		List<Usuario> result = criteria.list();
		if(result.isEmpty())
		{
			return null;
		}else
		{
			return result.get(0);	
		}
	}


	@Override
	public Usuario obtenerPorIS(String is, boolean soloActivos){
		Criteria criteria = getSession().createCriteria(getObjetoManejado());
		criteria.add(Restrictions.eq("codigoIS", is));
		criteria.add(Restrictions.eq("activo", true));
		
		List<Usuario> result = criteria.list();
		if(result.isEmpty()){
			return null;
		}else{
			return result.get(0);	
		}
	}


	@Override
	public List<String> obtenerFechas(long id) {
		StringBuilder sqlQuery = new StringBuilder("");
		String sql = 
				
			"SELECT DISTINCT exp.fechaModificacion FROM dbo.experiencia exp " +
			"WHERE exp.Usuario_id = " + id;
		
		sqlQuery.append(sql);
		SQLQuery q = getSession().createSQLQuery(sqlQuery.toString());
		List<Date> result = q.list();
		
		List<String> fechas = new ArrayList<String>();
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		
		String fechaStr =  "";
		for (Date fecha : result) {
			fechaStr = dateFormat.format(fecha);
			fechas.add(fechaStr);
		}
		
		
		return fechas;
	}



	
}
